package day20210706;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 1418. 点菜展示表
 *
 * @author lizy
 * @date 2021/07/05
 */
public class Solution {

    public static void main(String[] args) {
        Solution solution = new Solution();
        List<String> objects = new ArrayList<>();
        objects.add("James");
        objects.add("12");
        objects.add("Fried Chicken");

        List<String> objects1 = new ArrayList<>();
        objects1.add("Ratesh");
        objects1.add("12");
        objects1.add("Fried Chicken");

        List<String> objects2 = new ArrayList<>();
        objects2.add("Amadeus");
        objects2.add("1");
        objects2.add("Canadian Waffles");

        List<String> objects3 = new ArrayList<>();
        objects3.add("Brianna");
        objects3.add("1");
        objects3.add("Canadian Waffles");

        List<List<String>> orders = new ArrayList<>();
        orders.add(objects);
        orders.add(objects1);
        orders.add(objects2);
        orders.add(objects3);
        System.out.println(solution.displayTable(orders));
    }

    public List<List<String>> displayTable(List<List<String>> orders) {
        // 从订单中获取餐品名称和桌号，统计每桌点餐数量
        Set<String> nameSet = new HashSet<>();
        // 构造餐桌hash表
        Map<Integer, Map<String, Integer>> foodsCnt = new HashMap<>();
        for (List<String> order : orders) {
            // 获取食物名称
            nameSet.add(order.get(2));
            // 获取餐桌号
            int id = Integer.parseInt(order.get(1));
            Map<String, Integer> map = foodsCnt.getOrDefault(id, new HashMap<>());
            // 统计每桌点餐数量
            map.put(order.get(2), map.getOrDefault(order.get(2), 0) + 1);
            foodsCnt.put(id, map);
        }

        // 提取餐品名称，并按字母顺序排列
        int n = nameSet.size();
        List<String> names = new ArrayList<>();
        for (String name : nameSet) {
            names.add(name);
        }
        Collections.sort(names);

        // 提取桌号，并按餐桌桌号升序排列
        int m = foodsCnt.size();
        List<Integer> ids = new ArrayList<>();
        for (int id : foodsCnt.keySet()) {
            ids.add(id);
        }
        Collections.sort(ids);

        // 填写点菜展示表
        List<List<String>> table = new ArrayList<>();
        List<String> header = new ArrayList<>();
        header.add("Table");
        for (String name : names) {
            header.add(name);
        }
        table.add(header);
        for (int i = 0; i < m; ++i) {
            int id = ids.get(i);
            Map<String, Integer> cnt = foodsCnt.get(id);
            List<String> row = new ArrayList<>();
            row.add(Integer.toString(id));
            for (int j = 0; j < n; ++j) {
                row.add(Integer.toString(cnt.getOrDefault(names.get(j), 0)));
            }
            table.add(row);
        }
        return table;
    }
}
